package com.lagou.homework.stage01.module02;
import java.util.Arrays;
import java.util.Scanner;

public class Task2 {
    public static void main(String[] args) {
        int[][] arr = new int[16][16];

        for (int[] ints : arr) {
            Arrays.fill(ints, 0);
        }

        boolean flag=true;
        boolean res=true;
        Task2 t2 = new Task2();
        t2.draw(arr);
         while(res) {
             res=t2.remind(flag,arr);
             flag = !flag;
         }
    }

    //绘制棋盘
    private void draw(int[][] arr){
        if(16!=arr.length || 16!=arr[0].length){
            System.out.println("非法棋盘 ！");
            return;
        }

        //绘制第一行
        System.out.print(" "+"\t");
        for(int i =0;i<16;i++){
            System.out.print(Integer.toHexString(i)+"\t");
        }
        System.out.println();

        //绘制下面的行
        for(int i=0;i<arr.length;i++){
            System.out.print(Integer.toHexString(i)+"\t");
            for(int j=0;j<arr[i].length;j++){
                if(arr[i][j]==1){                            //1表示该位置为白棋子，打印O
                    System.out.print("O"+"\t");
                }else if(arr[i][j]==-1){                     //-1表示该位置为黑棋子，打印@
                    System.out.print("@"+"\t");
                }else{                                       //其他表示该位置没有放棋子，打印+
                    System.out.print("+"+"\t");
                }
            }
            System.out.println();
        }
    }

    //提醒黑方或白方落子，true表示白方，false表示黑方,返回值为true表示棋局继续，返回值为false表示棋局结束
    private boolean remind(boolean b,int[][] arr){
        if(16!=arr.length || 16!=arr[0].length){
            System.out.println("非法棋盘 ！");
            return false;
        }

        int x;
        int y;

        Scanner sc = new Scanner((System.in));
        if(b){
            do {
                System.out.println("请白方落子：");
                x = sc.nextInt();
                y = sc.nextInt();
                if (x >= 0 && x < 16 && y >= 0 && y < 16 && 1 != arr[x][y] && -1 != arr[x][y]) {
                    arr[x][y] = 1;
                    draw(arr);
                    if (check(arr, x, y)) {
                        System.out.println("白方获胜");
                        return false;
                    }
                    break;
                } else {
                    System.out.println("输入无效");
                }
            }while(true);
        }else{
            do{
                System.out.println("请黑方落子：");
                x=sc.nextInt();
                y=sc.nextInt();
                if(x>=0 && x<16 && y>=0 && y<16 && 1!=arr[x][y] && -1!=arr[x][y]){
                    arr[x][y]=-1;
                    draw(arr);
                    if(check(arr,x,y)){
                        System.out.println("黑方获胜");
                        return false;
                    }
                    break;
                }else{
                    System.out.println("输入无效");
                }
            }while(true);
        }

        return true;
    }

    //判断胜负，true表示分出胜负，false表示未分出
    private boolean check(int[][] arr,int x,int y){
        if(16!=arr.length || 16!=arr[0].length){
            System.out.println("输入非法 ！");
            return false;
        }

        int i;
        int j;

        //列遍历
        int count=0;
        //向上读取4个点
        for(j=y-1;j>y-5 && j>=0;j--) {
            if (arr[x][y] == arr[x][j]) {
                count++;
            } else {
                break;
            }
        }
        //向下读取4个点
        for(j=y+1;j<y+5 && j<16;j++) {
            if (arr[x][y] == arr[x][j]) {
                count++;
            } else {
                break;
            }
        }
        if(count>=4){
            return true;
        }

        //行遍历
        count=0;
        //向左读取
        for(i =x-1;i>x-5 && i>=0;i--){
            if(arr[x][y]==arr[i][y]){
                count++;
            }else{
                break;
            }
        }
        //向右读取
        for(i =x+1;i>x+5 && i<16;i++){
            if(arr[x][y]==arr[i][y]){
                count++;
            }else{
                break;
            }
        }
        if(count>=4){
            return true;
        }

        // \遍历
        count=0;
        // ↖读取\
        for(i = x-1,j=y-1;i>x-5 && i>=0 && j>y-5 && j>=0;i--,j--){
            if (arr[x][y] == arr[i][j]) {
                count++;
            } else {
                break;
            }
        }
        //↘读取
        for(i = x+1,j=y+1;i<x+5 && i<16 && j<y+5 && j<16;i++,j++){
            if(arr[x][y]==arr[i][j]){
                count++;
            }else {
                break;
            }
        }
        if(count>=4){
            return true;
        }

        // /遍历
        count=0;
        // ↗读取
        for(i = x+1,j=y-1;i<x+5 && i<16 && j>y-5 && j>=0;i++,j--){
            if(arr[x][y]==arr[i][j]){
                count++;
            }else {
                break;
            }
        }
        //↙读取
        for(i = x-1,j=y+1;i>x-5 && i>=0 && j<y+5 && j<16;i--,j++){
            if(arr[x][y]==arr[i][j]){
                count++;
            }else {
                break;
            }
        }
        return count >= 4;
    }

}
